<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package		CodeIgniter
 * @author		ExpressionEngine Dev Team
 * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc.
 * @license		http://codeigniter.com/user_guide/license.html
 * @link		http://codeigniter.com
 * @since		Version 1.0
 * @filesource
 */

// ------------------------------------------------------------------------

/**
 * Common Functions
 *
 * Loads the base classes and executes the request.
 *
 * @package		CodeIgniter
 * @subpackage	codeigniter
 * @category	Common Functions
 * @author		ExpressionEngine Dev Team
 * @link		http://codeigniter.com/user_guide/
 */

// ------------------------------------------------------------------------

/**
* Determines if the current version of PHP is greater then the supplied value
*
* Since there are a few places where we conditionally test for PHP > 5
* we'll set a static variable.
*
* @access	public
* @param	string
* @return	bool	TRUE if the current version is $version or higher
*/
if ( ! function_exists('is_php'))
{
	function is_php($version = '5.0.0')
	{
		static $_is_php;
		$version = (string)$version;

		if ( ! isset($_is_php[$version]))
		{
			$_is_php[$version] = (version_compare(PHP_VERSION, $version) < 0) ? FALSE : TRUE;
		}

		return $_is_php[$version];
	}
}

// ------------------------------------------------------------------------

/**
 * Tests for file writability
 *
 * is_writable() returns TRUE on Windows servers when you really can't write to
 * the file, based on the read-only attribute.  is_writable() is also unreliable
 * on Unix servers if safe_mode is on.
 *
 * @access	private
 * @return	void
 */
if ( ! function_exists('is_really_writable'))
{
	function is_really_writable($file)
	{
		// If we're on a Unix server with safe_mode off we call is_writable
		if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
		{
			return is_writable($file);
		}

		// For windows servers and safe_mode "on" installations we'll actually
		// write a file then read it.  Bah...
		if (is_dir($file))
		{
			$file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));

			if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
			{
				return FALSE;
			}

			fclose($fp);
			@chmod($file, DIR_WRITE_MODE);
			@unlink($file);
			return TRUE;
		}
		elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
		{
			return FALSE;
		}

		fclose($fp);
		return TRUE;
	}
}

// ------------------------------------------------------------------------

/**
* Class registry
*
* This function acts as a singleton.  If the requested class does not
* exist it is instantiated and set to a static variable.  If it has
* previously been instantiated the variable is returned.
*
* @access	public
* @param	string	the class name being requested
* @param	string	the directory where the class should be found
* @param	string	the class name prefix
* @return	object
*/
if ( ! function_exists('load_class'))
{
	function &load_class($class, $directory = 'libraries', $prefix = 'CI_')
	{
		static $_classes = array();

		// Does the class exist?  If so, we're done...
		if (isset($_classes[$class]))
		{
			return $_classes[$class];
		}

		$name = FALSE;

		// Look for the class first in the local application/libraries folder
		// then in the native system/libraries folder
		foreach (array(APPPATH, BASEPATH) as $path)
		{
			if (file_exists($path.$directory.'/'.$class.'.php'))
			{
				$name = $prefix.$class;

				if (class_exists($name) === FALSE)
				{
					require($path.$directory.'/'.$class.'.php');
				}

				break;
			}
		}

		// Is the request a class extension?  If so we load it too
		if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'))
		{
			$name = config_item('subclass_prefix').$class;

			if (class_exists($name) === FALSE)
			{
				require(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php');
			}
		}

		// Did we find the class?
		if ($name === FALSE)
		{
			// Note: We use exit() rather then show_error() in order to avoid a
			// self-referencing loop with the Excptions class
			exit('Unable to locate the specified class: '.$class.'.php');
		}

		// Keep track of what we just loaded
		is_loaded($class);

		$_classes[$class] = new $name();
		return $_classes[$class];
	}
}

// --------------------------------------------------------------------

/**
* Keeps track of which libraries have been loaded.  This function is
* called by the load_class() function above
*
* @access	public
* @return	array
*/
if ( ! function_exists('is_loaded'))
{
	function &is_loaded($class = '')
	{
		static $_is_loaded = array();

		if ($class != '')
		{
			$_is_loaded[strtolower($class)] = $class;
		}

		return $_is_loaded;
	}
}

// ------------------------------------------------------------------------

/**
* Loads the main config.php file
*
* This function lets us grab the config file even if the Config class
* hasn't been instantiated yet
*
* @access	private
* @return	array
*/
if ( ! function_exists('get_config'))
{
	function &get_config($replace = array())
	{
		static $_config;

		if (isset($_config))
		{
			return $_config[0];
		}

		// Is the config file in the environment folder?
		if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php'))
		{
			$file_path = APPPATH.'config/config.php';
		}

		// Fetch the config file
		if ( ! file_exists($file_path))
		{
			exit('The configuration file does not exist.');
		}

		require($file_path);

		// Does the $config array exist in the file?
		if ( ! isset($config) OR ! is_array($config))
		{
			exit('Your config file does not appear to be formatted correctly.');
		}

		// Are any values being dynamically replaced?
		if (count($replace) > 0)
		{
			foreach ($replace as $key => $val)
			{
				if (isset($config[$key]))
				{
					$config[$key] = $val;
				}
			}
		}

		return $_config[0] =& $config;
	}
}

// ------------------------------------------------------------------------

/**
* Returns the specified config item
*
* @access	public
* @return	mixed
*/
if ( ! function_exists('config_item'))
{
	function config_item($item)
	{
		static $_config_item = array();

		if ( ! isset($_config_item[$item]))
		{
			$config =& get_config();

			if ( ! isset($config[$item]))
			{
				return FALSE;
			}
			$_config_item[$item] = $config[$item];
		}

		return $_config_item[$item];
	}
}

// ------------------------------------------------------------------------

/**
* Error Handler
*
* This function lets us invoke the exception class and
* display errors using the standard error template located
* in application/errors/errors.php
* This function will send the error page directly to the
* browser and exit.
*
* @access	public
* @return	void
*/
if ( ! function_exists('show_error'))
{
	function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered')
	{
		$_error =& load_class('Exceptions', 'core');
		echo $_error->show_error($heading, $message, 'error_general', $status_code);
		exit;
	}
}

// ------------------------------------------------------------------------

/**
* 404 Page Handler
*
* This function is similar to the show_error() function above
* However, instead of the standard error template it displays
* 404 errors.
*
* @access	public
* @return	void
*/
if ( ! function_exists('show_404'))
{
	function show_404($page = '', $log_error = TRUE)
	{
		$_error =& load_class('Exceptions', 'core');
		$_error->show_404($page, $log_error);
		exit;
	}
}
// ------------------------------------------------------------------------

/**
 * 自定义显示内容：如维护中
 *
 * @access	public
 * @return	void
 */
if ( ! function_exists('show_message'))
{
	function show_message($heading, $message)
	{
		$_error =& load_class('Exceptions', 'core');
		$_error->show_message($heading, $message);
		exit;
	}
}
// ------------------------------------------------------------------------

/**
* Error Logging Interface
*
* We use this as a simple mechanism to access the logging
* class and send messages to be logged.
*
* @access	public
* @return	void
*/
if ( ! function_exists('log_message'))
{
	function log_message($level = 'error', $message, $php_error = FALSE)
	{
		static $_log;

		if (config_item('log_threshold') == 0)
		{
			return;
		}

		$_log =& load_class('Log');
		$_log->write_log($level, $message, $php_error);
	}
}

// ------------------------------------------------------------------------

/**
 * Set HTTP Status Header
 *
 * @access	public
 * @param	int		the status code
 * @param	string
 * @return	void
 */
if ( ! function_exists('set_status_header'))
{
	function set_status_header($code = 200, $text = '')
	{
		$stati = array(
							200	=> 'OK',
							201	=> 'Created',
							202	=> 'Accepted',
							203	=> 'Non-Authoritative Information',
							204	=> 'No Content',
							205	=> 'Reset Content',
							206	=> 'Partial Content',

							300	=> 'Multiple Choices',
							301	=> 'Moved Permanently',
							302	=> 'Found',
							304	=> 'Not Modified',
							305	=> 'Use Proxy',
							307	=> 'Temporary Redirect',

							400	=> 'Bad Request',
							401	=> 'Unauthorized',
							403	=> 'Forbidden',
							404	=> 'Not Found',
							405	=> 'Method Not Allowed',
							406	=> 'Not Acceptable',
							407	=> 'Proxy Authentication Required',
							408	=> 'Request Timeout',
							409	=> 'Conflict',
							410	=> 'Gone',
							411	=> 'Length Required',
							412	=> 'Precondition Failed',
							413	=> 'Request Entity Too Large',
							414	=> 'Request-URI Too Long',
							415	=> 'Unsupported Media Type',
							416	=> 'Requested Range Not Satisfiable',
							417	=> 'Expectation Failed',

							500	=> 'Internal Server Error',
							501	=> 'Not Implemented',
							502	=> 'Bad Gateway',
							503	=> 'Service Unavailable',
							504	=> 'Gateway Timeout',
							505	=> 'HTTP Version Not Supported'
						);

		if ($code == '' OR ! is_numeric($code))
		{
			show_error('Status codes must be numeric', 500);
		}

		if (isset($stati[$code]) AND $text == '')
		{
			$text = $stati[$code];
		}

		if ($text == '')
		{
			show_error('No status text available.  Please check your status code number or supply your own message text.', 500);
		}

		$server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : FALSE;

		if (substr(php_sapi_name(), 0, 3) == 'cgi')
		{
			header("Status: {$code} {$text}", TRUE);
		}
		elseif ($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0')
		{
			header($server_protocol." {$code} {$text}", TRUE, $code);
		}
		else
		{
			header("HTTP/1.1 {$code} {$text}", TRUE, $code);
		}
	}
}

// --------------------------------------------------------------------

/**
* Exception Handler
*
* This is the custom exception handler that is declaired at the top
* of Codeigniter.php.  The main reason we use this is to permit
* PHP errors to be logged in our own log files since the user may
* not have access to server logs. Since this function
* effectively intercepts PHP errors, however, we also need
* to display errors based on the current error_reporting level.
* We do that with the use of a PHP error template.
*
* @access	private
* @return	void
*/
if ( ! function_exists('_exception_handler'))
{
	function _exception_handler($severity, $message, $filepath, $line)
	{
		 // We don't bother with "strict" notices since they tend to fill up
		 // the log file with excess information that isn't normally very helpful.
		 // For example, if you are running PHP 5 and you use version 4 style
		 // class functions (without prefixes like "public", "private", etc.)
		 // you'll get notices telling you that these have been deprecated.
		 //echo $severity.'<hr>'. $message.'<hr>'. $filepath.'<hr>'. $line;die();
		 
		if ($severity == E_STRICT)
		{
			return;
		}

		$_error =& load_class('Exceptions', 'core');

		// Should we display the error? We'll get the current error_reporting
		// level and add its bits with the severity bits to find out.
		if (($severity & error_reporting()) == $severity)
		{
			$_error->show_php_error($severity, $message, $filepath, $line);
		}

		// Should we log the error?  No?  We're done...
		if (config_item('log_threshold') == 0)
		{
			return;
		}

		$_error->log_exception($severity, $message, $filepath, $line);
	}
}

// --------------------------------------------------------------------

/**
 * Remove Invisible Characters
 *
 * This prevents sandwiching null characters
 * between ascii characters, like Java\0script.
 *
 * @access	public
 * @param	string
 * @return	string
 */
if ( ! function_exists('remove_invisible_characters'))
{
	function remove_invisible_characters($str, $url_encoded = TRUE)
	{
		$non_displayables = array();
		
		// every control character except newline (dec 10)
		// carriage return (dec 13), and horizontal tab (dec 09)
		
		if ($url_encoded)
		{
			$non_displayables[] = '/%0[0-8bcef]/';	// url encoded 00-08, 11, 12, 14, 15
			$non_displayables[] = '/%1[0-9a-f]/';	// url encoded 16-31
		}
		
		$non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';	// 00-08, 11, 12, 14-31, 127

		do
		{
			$str = preg_replace($non_displayables, '', $str, -1, $count);
		}
		while ($count);

		return $str;
	}
}

// ------------------------------------------------------------------------

/**
* Returns HTML escaped variable
*
* @access	public
* @param	mixed
* @return	mixed
*/
if ( ! function_exists('html_escape'))
{
	function html_escape($var)
	{
		if (is_array($var))
		{
			return array_map('html_escape', $var);
		}
		else
		{
			return htmlspecialchars($var, ENT_QUOTES, config_item('charset'));
		}
	}
}


if ( ! function_exists('changelan'))
{
	function changelan($lan)
	{		
		setcookie('cookieslan',$lan,time()+13600,'/',config_item('cookie_domain'));
// 		setcookie('cookieslan',$lan,time()+13600,'/','');
//		var_dump($_COOKIE['cookieslan']);
		return true;
	}
}




/**
* 消息跳转
*
参数:
$msg	显示的消息
$url	跳转url
$time	停留时间,默认为2秒
*/
function messShow($msg,$url,$time='2')
{
	if(is_array($msg)){
		echo implode("<br>",$msg);
	}else{
		echo $msg;	
	}
	echo "<meta http-equiv=refresh content='$time; url=$url'>";
	exit;
}
/*消息跳转
参数：
$message	显示的消息
$url		跳转url
$status_code 停留时间
$heading	提示消息标题
*/
if ( ! function_exists('show_jump'))
{
	function show_jump($message,$url, $heading='提示信息！', $status_code = 500)
	{
		$_error =& load_class('Exceptions', 'core');
		echo $_error->show_jump($heading, $message, $url, 'show_general', $status_code);
		exit;
	}
}



function creatfolder($path)
{
	if (!file_exists($path))
	{
		mkdir($path, 0777,true);
		mkdir($path.'/company', 0777);
		mkdir($path.'/pro', 0777);
		mkdir($path.'/pro/b', 0777);
		mkdir($path.'/pro/m', 0777);
		mkdir($path.'/pro/s', 0777);
		mkdir($path.'/proclass', 0777);
	}else{
		if (!file_exists($path.'/company'))	{
			mkdir($path.'/company', 0777);	
		}
		if (!file_exists($path.'/pro'))	{
			mkdir($path.'/pro', 0777);	
		}
		if (!file_exists($path.'/pro/b'))	{
			mkdir($path.'/pro/b', 0777);	
		}
		if (!file_exists($path.'/pro/m'))	{
			mkdir($path.'/pro/m', 0777);	
		}
		if (!file_exists($path.'/pro/s'))	{
			mkdir($path.'/pro/s', 0777);	
		}
		if (!file_exists($path.'/proclass'))	{
			mkdir($path.'/proclass', 0777);	
		}
	}
	return true;		
}
/**
 创建多级目录
 */
function mkdir_deep($dir,$mode=0777)
{
	if(!is_dir($dir))
	{
		if(!mkdir_deep(dirname($dir)))
		{  
			return false;
		}
		if(!mkdir($dir,$mode))
		{
			return false;
		}
	}
	return true;
}


/**
生成二维码
*/
function creatqrcode($value,$companyname,$picname,$errorCorrectionLevel='L',$matrixPointSize='50')
{
	include dirname(__FILE__)."/../../phpqrcode/phpqrcode.php";
	QRcode::png($value, dirname(__FILE__).'/../../pic/'.$companyname.'/'.$picname, $errorCorrectionLevel, $matrixPointSize);	
	
//	include "./phpqrcode-master/qrlib.php";
//	//背景色
//	$backColor = 0x00000000;
//	//前景色
//	$foreColor = 0x000000FF;
//	// 创建一个二维码并以svg格式输出
//	// 第六个参数似乎是一个无用的参数,他是用来保存到文件中然后输出到浏览器,但是基本上不会为你服务
//	QRcode::svg("http://www.baidu.com/", "test-me.svg", "L", 4, 4, false, $backColor, $foreColor);
	
	
	
	return true;
}


/*
php缩略图函数：
	等比例无损压缩，可填充补充色
主持格式：
	bmp 、jpg 、gif、png
param:
	@srcimage : 要缩小的图片
	@dstimage : 要保存的图片
	@dst_width: 缩小宽
	@dst_height: 缩小高
	@backgroundcolor: 补充色  如：#FFFFFF  支持 6位  不支持3位
*/
function imagezoom( $srcimage, $dstimage,  $dst_width, $dst_height, $backgroundcolor='#FFFFFF' ) {
		
		// 中文件名乱码
		if ( PHP_OS == 'WINNT' ) {
				$srcimage = iconv('UTF-8', 'GBK', $srcimage);
				$dstimage = iconv('UTF-8', 'GBK', $dstimage);
		}
	
	$dstimg = imagecreatetruecolor( $dst_width, $dst_height );
	$color = imagecolorallocate($dstimg
		, hexdec(substr($backgroundcolor, 1, 2))
		, hexdec(substr($backgroundcolor, 3, 2))
		, hexdec(substr($backgroundcolor, 5, 2))
	);
	imagefill($dstimg, 0, 0, $color);
	
	if ( !$arr=getimagesize($srcimage) ) {
				echo "要生成缩略图的文件不存在";
				exit;
		}
		
	$src_width = $arr[0];
	$src_height = $arr[1];
	$srcimg = null;
	$method = getcreatemethod( $srcimage );
	if ( $method ) {
		eval( '$srcimg = ' . $method . ';' );
	}
	
	$dst_x = 0;
	$dst_y = 0;
	$dst_w = $dst_width;
	
	if(empty($dst_height)){//为空表示按比例缩放
		$dst_height = ($dst_width * $src_height)/$src_width;
	}
	
	$dst_h = $dst_height;

	if ( ($dst_width / $dst_height - $src_width / $src_height) > 0 ) {
		$dst_w = $src_width * ( $dst_height / $src_height );
		$dst_x = ( $dst_width - $dst_w ) / 2;
	} elseif ( ($dst_width / $dst_height - $src_width / $src_height) < 0 ) {
		$dst_h = $src_height * ( $dst_width / $src_width );
		$dst_y = ( $dst_height - $dst_h ) / 2;
	}

	imagecopyresampled($dstimg, $srcimg, $dst_x
		, $dst_y, 0, 0, $dst_w, $dst_h, $src_width, $src_height);
	
	// 保存格式
	$arr = array(
		'jpg' => 'imagejpeg'
		, 'jpeg' => 'imagejpeg'
		, 'png' => 'imagepng'
		, 'gif' => 'imagegif'
		, 'bmp' => 'imagebmp'
	);
	$suffix = strtolower( array_pop(explode('.', $dstimage ) ) );
	if (!in_array($suffix, array_keys($arr)) ) {
		echo "保存的文件名错误";
		exit;
	} else {
		eval( $arr[$suffix] . '($dstimg, "'.$dstimage.'");' );
	}
	
	imagejpeg($dstimg, $dstimage);
	
	imagedestroy($dstimg);
	imagedestroy($srcimg);
	
}


function getcreatemethod( $file ) {
		$arr = array(
				'474946' => "imagecreatefromgif('$file')"
				, 'FFD8FF' => "imagecreatefromjpeg('$file')"
				, '424D' => "imagecreatefrombmp('$file')"
				, '89504E' => "imagecreatefrompng('$file')"
		);
		$fd = fopen( $file, "rb" );
		$data = fread( $fd, 3 );
		
		$data = str2hex( $data );
		
		if ( array_key_exists( $data, $arr ) ) {
				return $arr[$data];
		} elseif ( array_key_exists( substr($data, 0, 4), $arr ) ) {
				return $arr[substr($data, 0, 4)];
		} else {
				return false;
		}
}

function str2hex( $str ) {
		$ret = "";
		
		for( $i = 0; $i < strlen( $str ) ; $i++ ) {
				$ret .= ord($str[$i]) >= 16 ? strval( dechex( ord($str[$i]) ) )
						: '0'. strval( dechex( ord($str[$i]) ) );
		}
		
		return strtoupper( $ret );
}

// BMP 创建函数  php本身无
function imagecreatefrombmp($filename)
{
   if (! $f1 = fopen($filename,"rb")) return FALSE;

   $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14));
   if ($FILE['file_type'] != 19778) return FALSE;

   $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.
				 '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
				 '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40));
   $BMP['colors'] = pow(2,$BMP['bits_per_pixel']);
   if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
   $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;
   $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
   $BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);
   $BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4);
   $BMP['decal'] = 4-(4*$BMP['decal']);
   if ($BMP['decal'] == 4) $BMP['decal'] = 0;
   
   $PALETTE = array();
   if ($BMP['colors'] < 16777216)
   {
	$PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4));
   }
   
   $IMG = fread($f1,$BMP['size_bitmap']);
   $VIDE = chr(0);

   $res = imagecreatetruecolor($BMP['width'],$BMP['height']);
   $P = 0;
   $Y = $BMP['height']-1;
   while ($Y >= 0)
   {
		$X=0;
		while ($X < $BMP['width'])
		{
		 if ($BMP['bits_per_pixel'] == 24)
			$COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
		 elseif ($BMP['bits_per_pixel'] == 16)
		 {  
			$COLOR = unpack("n",substr($IMG,$P,2));
			$COLOR[1] = $PALETTE[$COLOR[1]+1];
		 }
		 elseif ($BMP['bits_per_pixel'] == 8)
		 {  
			$COLOR = unpack("n",$VIDE.substr($IMG,$P,1));
			$COLOR[1] = $PALETTE[$COLOR[1]+1];
		 }
		 elseif ($BMP['bits_per_pixel'] == 4)
		 {
			$COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
			if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F);
			$COLOR[1] = $PALETTE[$COLOR[1]+1];
		 }
		 elseif ($BMP['bits_per_pixel'] == 1)
		 {
			$COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
			if     (($P*8)%8 == 0) $COLOR[1] =  $COLOR[1]        >>7;
			elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6;
			elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5;
			elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4;
			elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3;
			elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2;
			elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1;
			elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);
			$COLOR[1] = $PALETTE[$COLOR[1]+1];
		 }
		 else
			return FALSE;
		 imagesetpixel($res,$X,$Y,$COLOR[1]);
		 $X++;
		 $P += $BMP['bytes_per_pixel'];
		}
		$Y--;
		$P+=$BMP['decal'];
   }
   fclose($f1);

return $res;
}
// BMP 保存函数，php本身无
function imagebmp ($im, $fn = false)
{
	if (!$im) return false;
			
	if ($fn === false) $fn = 'php://output';
	$f = fopen ($fn, "w");
	if (!$f) return false;
			
	$biWidth = imagesx ($im);
	$biHeight = imagesy ($im);
	$biBPLine = $biWidth * 3;
	$biStride = ($biBPLine + 3) & ~3;
	$biSizeImage = $biStride * $biHeight;
	$bfOffBits = 54;
	$bfSize = $bfOffBits + $biSizeImage;
			
	fwrite ($f, 'BM', 2);
	fwrite ($f, pack ('VvvV', $bfSize, 0, 0, $bfOffBits));
			
	fwrite ($f, pack ('VVVvvVVVVVV', 40, $biWidth, $biHeight, 1, 24, 0, $biSizeImage, 0, 0, 0, 0));
			
	$numpad = $biStride - $biBPLine;
	for ($y = $biHeight - 1; $y >= 0; --$y)
	{
		for ($x = 0; $x < $biWidth; ++$x)
		{
			$col = imagecolorat ($im, $x, $y);
			fwrite ($f, pack ('V', $col), 3);
		}
		for ($i = 0; $i < $numpad; ++$i)
			fwrite ($f, pack ('C', 0));
	}
	fclose ($f);
	return true;
}

/**
获取数组某一部分
*/
function get_array_items($aItem,$start = 0,$offset = 0){
	$result = array();
	$i =0;
	$end = $start + $offset;
	if(!empty($aItem)){
		foreach($aItem as $key=>$value){
			if(++$i > $start and $i <= $end){
				$result[$key] = $value;
			}
			if($i > $end) break;
		}
	}
	return $result;
}

/**
笛卡尔积
*/
function get_all($e,$deep='3')
{
	//print_r($e);
    $elem_total = count($e);
    $max = 1;
    for ($i=0; $i<$elem_total; $i++) {
        $len = count($e[$i])+1;
        $elem_size[] = $len;
        $max *= $len;
    }   
    for ($i=1; $i<$max; $i++) {
        $m = $i; 
        $item = ""; 
        $ct = 0;
        for ($j=0; $j<$elem_total; $j++) {
            $n = $m%$elem_size[$j];
            $item .= $n>0?$e[$j][$n-1].'_':"";
            $ct += $n>0?1:0;
            $m = (int)($m/$elem_size[$j]);
        }   
        if ($ct>=$deep)
            $all[] = substr($item,0,-1);
    }   
    return $all;
}


function get_current_lan()
{
		if(empty($_COOKIE['cookieslan'])){
			$deflan = current($_SESSION['user']['s_lans']);
			$lan = 	$deflan['id'];	
		}else{
			$lan = 	$_COOKIE['cookieslan'];	
		}	
		return $lan;
}


//解释URL
function explanationurl($url)
{
	if(empty($url)){
		return false;	
	}
	$behind = base64_decode(end(explode('/',$url)));	
	$front = end(explode('/',$url,-1));
	return $front.'/'.$behind;
	//echo $behind;
	//echo '<pre>';print_r($front);
}




/**
  +----------------------------------------------------------
 * 将一个字符串部分字符用*替代隐藏
  +----------------------------------------------------------
 * @param string    $string   待转换的字符串
 * @param int       $bengin   起始位置，从0开始计数，当$type=4时，表示左侧保留长度
 * @param int       $len      需要转换成*的字符个数，当$type=4时，表示右侧保留长度
 * @param int       $type     转换类型：0，从左向右隐藏；1，从右向左隐藏；2，从指定字符位置分割前由右向左隐藏；3，从指定字符位置分割后由左向右隐藏；4，保留首末指定字符串
 * @param string    $glue     分割符
  +----------------------------------------------------------
 * @return string   处理后的字符串
  +----------------------------------------------------------
 */
function hideStr($string, $bengin=0, $len = 4, $type = 0, $glue = "@") {
    if (empty($string))
        return false;
    $array = array();
    if ($type == 0 || $type == 1 || $type == 4) {
        $strlen = $length = mb_strlen($string);
        while ($strlen) {
            $array[] = mb_substr($string, 0, 1, "utf8");
            $string = mb_substr($string, 1, $strlen, "utf8");
            $strlen = mb_strlen($string);
        }
    }
    if ($type == 0) {
        for ($i = $bengin; $i < ($bengin + $len); $i++) {
            if (isset($array[$i]))
                $array[$i] = "*";
        }
        $string = implode("", $array);
    }else if ($type == 1) {
        $array = array_reverse($array);
        for ($i = $bengin; $i < ($bengin + $len); $i++) {
            if (isset($array[$i]))
                $array[$i] = "*";
        }
        $string = implode("", array_reverse($array));
    }else if ($type == 2) {
        $array = explode($glue, $string);
        $array[0] = hideStr($array[0], $bengin, $len, 1);
        $string = implode($glue, $array);
    } else if ($type == 3) {
        $array = explode($glue, $string);
        $array[1] = hideStr($array[1], $bengin, $len, 0);
        $string = implode($glue, $array);
    } else if ($type == 4) {
        $left = $bengin;
        $right = $len;
        $tem = array();
        for ($i = 0; $i < ($length - $right); $i++) {
            if (isset($array[$i]))
                $tem[] = $i >= $left ? "*" : $array[$i];
        }
        $array = array_chunk(array_reverse($array), $right);
        $array = array_reverse($array[0]);
        for ($i = 0; $i < $right; $i++) {
            $tem[] = $array[$i];
        }
        $string = implode("", $tem);
    }
    return $string;
}
//替换url的查询字段内容
function format_url($query,$url=''){
	$url or $url = get_current_page_url();
	$parse = parse_url($url);
	isset($parse['query']) && parse_str($parse['query'],$params);
	foreach($query as $key=>$value){
		if($value === 'NULL' && isset($params[$key])){
			unset($params[$key]);
		}else{
			$params[$key] = $value;
		}
		
	}
	return ($_SERVER["HTTPS"] == "on" ? 'https://' : 'http://').$_SERVER["HTTP_HOST"].$parse['path'] .'?'. http_build_query($params);
}
//获取当前url
function get_current_page_url() {
	return ($_SERVER["HTTPS"] == "on" ? 'https://' : 'http://').$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
}


//启用调试
if ( ! function_exists('debugit')){
	function debugit($show = '') {	
		$_debugit =& load_class('Profiler');
		$res = $_debugit->run();
		if(!empty($show)){
			echo $res;
		}
		$filename = 'debug_'.date('Y-m-d-H-i-s').'_'.microtime().'_log.htm';
		file_put_contents('errorlog/'.$filename,$res);	
		//$db =& load_class('m_manage','models/admin/','');
		//$db->debug_log_in($filename);
	}	
}


//加密函数
function encrypt($txt, $key=KEY) 
{ 
	$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 
	$nh = rand(0,61); 
	$ch = $chars[$nh]; 
	$mdKey = md5($key.$ch); 
	$mdKey = substr($mdKey,$nh%8, $nh%8+7); 
	$txt = base64_encode($txt); 
	$tmp = ''; 
	$i=0;$j=0;$k = 0; 
	for ($i=0; $i<strlen($txt); $i++) { 
		$k = $k == strlen($mdKey) ? 0 : $k; 
		$j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%61; 
		$tmp .= $chars[$j]; 
	} 
	return $ch.$tmp; 
} 
//解密函数 
function decrypt($txt, $key=KEY) 
{ 
	$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 
	$ch = $txt[0]; 
	$nh = strpos($chars,$ch); 
	$mdKey = md5($key.$ch); 
	$mdKey = substr($mdKey,$nh%8, $nh%8+7); 
	$txt = substr($txt,1); 
	$tmp = ''; 
	$i=0;$j=0; $k = 0; 
	for ($i=0; $i<strlen($txt); $i++) { 
		$k = $k == strlen($mdKey) ? 0 : $k; 
		$j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]); 
		while ($j<0) $j+=61; 
		$tmp .= $chars[$j]; 
	} 
	return base64_decode($tmp); 
}



//生成与时间相关的16位随机码，用于账号文件夹
function creat_folder_name()
{
	$ychar = "1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
	$list = explode(",",$ychar); 
	for($i=0;$i<6;$i++){ 
		$randnum = rand(0,33); 
		$authnum.= $list[$randnum]; 
	} 
	$temp = md5(microtime().$authnum);
	return substr($temp,8,16);
}

function login_user(){
    session_start();
    $admin=$_SESSION['login_user'];
    return $admin;
}
function utf8Substr($str, $from, $len) {
	return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $from . '}' .
	'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $len . '}).*#s', '$1', $str);
}
/* End of file Common.php */
/* Location: ./system/core/Common.php */